eduardok / libsmbclient-php Goto Github PK
View Code? Open in Web Editor NEWsmbclient's extension for PHP
License: Other
smbclient's extension for PHP
License: Other
libsmbclient-php
has been released as versions 0.1, 0.2 and 0.3, but none of the releases have been tagged as such, or turned into downloadable release tarballs. For the benefit of end users, it would be preferable to tag each version and create a release tarball.
The advantage is that the install process can be made much easier by saying "download the latest tarball from github" instead of "git clone the code locally, git checkout commit 76ab345b43, run git archive..."
Not sure if this is an issue with libsmbclient or libsmbclient-php.
When setting SMBCLIENT_OPT_USE_NT_HASH to true you can access (and list etc.) the root of a DFS share but none of it's subfolders. This works fine when using plain credentials.
In the case of multiple threads, does it remain normal?
Hey guys,
could you please have a look at this issue I opened in the owncloud section:
owncloud/core#26155 (comment)
It looks like there is something wrong with libsmbclient on raspian...
When connecting to a standard Windows/SAMBA file server, calling smbclient_state_free
ensures that the connection is closed. Since smbc_free_context
is called in the module's destructor we can even get away with not calling it. However, when the connection is to a DFS target said connection remains open even after the script completes.
After connecting to a DFS target, running lsof | grep microsoft
on the server yields four open microsoft-ds connections per request. This can cause serious issues because eventually the system will reach it's open files limit and crash.
The only way to close the connections is to restart Apache and this issue can be worked around by setting MaxRequestsPerChild
in httpd.conf to something very low (say fifteen) but from a performance standpoint this is less than ideal.
It seems that the connections live as long as PHP does so this issue does not occur when running a script from the command line.
I think that in the case of DFS we need to be doing something more than calling smbc_free_context
. Looking through http://fossies.org/linux/misc/samba-4.0.25.tar.gz/samba-4.0.25/source3/libsmb/clientgen.c there is a cli_shutdown
function which talks about connections remaining active even when smbc_free_context
is called but I'm not sure if this is relevant here.
Hi! When trying to add Samba support for the nextcloud-snap we used your library:
But we hit a problem where adding Samba shares works for the nextcloud-snap for amd64 but not for armhf:
Did anyone see a problem like this before? How can we debug the issue with the wrapper (if there is one)?
When running the test suite a notice this message
no talloc stackframe around, leaking memory
Also present on travis build
After digging, I think this is a samba issue fixed in 4.2+
Nothing which can be fixed in this project, only a tracker for people searching about this.
Libsmbclient has various functions for printing to print shares, getting print queues and so on. We should add them, because it's easy to do so within the framework that we have and because it's the last large bit of upstream functionality we don't expose.
Our organization has shutdown the use of SMB protocol (version) 1.0. Is there a way to force php smbclient to use a different protocol such as 2.0, 2.1, or 3.0?
Our organization has disabled SMB 1.0 due to vulnarebilities. However, for some reason owncloud wont connect to the shares if SMBv1 is disabled.
Is there a way to force php smbclient to use SMv2.0?
I have already changed the smb.conf file to look like:
max open files = 32808
server string = %h univention corporate server
ntlm auth = yes
machine password timeout = 0
acl allow execute always = True
min protocol = SMB2
max protocol = SMB3
client ipc min protocol = SMB2
client ipc max protocol = SMB3
Please help as I cannot keep the SMBv1 enabled for long.
Checked with unreleased samba 4.8.0 (compiled from samba-team/samba@20fe434) and libsmbclient-php 0.9.0 (also compiled against the above)
The test script matches the one shown in the example of this repository, adjusted to connect to the target server.
PHP Warning: Couldn't open SMB directory smb://10.0.2.8/opt: Permission denied in /opt/test.php on line 11
Filling the workgroup with any random value solves the problem, as long as the server supports it
HI,
Is it also possible to display file or folder creation date? Using stat of fstat is not returning that information..
Thanks!
Running some debug, I discover some segfault issues when both extensions are loaded.
This is related fo sasl_client_done() called during process shutdown
More on https://jira.mongodb.org/browse/PHPC-658
For now, workaround is to load smbclient "before" mongodb.
The smb://
builtin stream wrapper and smb_state_init
seem to behave differently when setting an empty workgroup.
var_dump(scandir('smb://test:test@localhost/test'));
$state = smbclient_state_new();
smbclient_option_set($state, SMBCLIENT_OPT_AUTO_ANONYMOUS_LOGIN, false);
var_dump(smbclient_state_init($state, null, 'test', 'test'));
$dir = smbclient_opendir($state, 'smb://localhost/test');
var_dump($dir);
var_dump(smbclient_state_errno($state));
The top line prints the expected folder content, while the bottom part fails with 'Workgroup no found' (same error when passing false
or ''
as workgroup, setting a non empty string makes things work as expected)
Since no workgroup is passed to the stream wrapper I would expect it to fail in the same way as the smb_state_
functions
Hello,
When i execute the command ./configure it will show an error as
==================================
checking for libsmbclient support... yes, shared
checking for libsmbclient.h in default paths... not found
configure: error: Could not find libsmbclient.h
=================================
Please help to let me know does it also need some other client as well to install. or Which PHP version.
Currently i have php 5.6
checking whether to enable smbclient support... yes, shared
checking for libsmbclient support... yes, shared
checking for libsmbclient.h in default paths... found in /usr/include/samba-4.0
checking for smbc_getOptionUserData in -lsmbclient... no
configure: error: Could not find libsmbclient.so or symbol smbc_getOptionUserData. Check version and config.log for more information.
Will try to investigate for a fix ASAP
If you guys use IRC, please join me on freenode's #smbclient-php
I suppose we can pick another channel name if you guys prefer.
Many functions have been added since the release of 0.5.0, along with unit tests which all pass. My work queue is empty and I consider this project to be at a stable point, so how about a new release?
Just installed this with PHP 7.4 and it seems to work, but is it actually supported?
Thanks!
I just had to install libsmbclient-php on a FreeBSD system (to be correct, on a Jail on a FreeNAS system).
The problem is, on FreeBSD, there is no such library. So the test for smbc_open will fail due to this.
Error message : configure: error: Could not find libsmbclient.so or symbol smbc_open. Check config.log for more information.
The solution to this problem is pretty simple, just remove -ldl in this part of the configure file (generated after the "phpize" command) :
save_old_LDFLAGS=$LDFLAGS
ac_stuff="
-lsmbclient -lm -ldl
"
And now, the ./configure should be ok
Hi Guys,
I've just installed a virtualbox ubuntu vm to test the libsmbclient.. I followed the installation instructions, but on the ./configure command, i receive the following error:
checking for libsmbclient.h in default paths... not found
configure: error: Could not find libsmbclient.h
Does anyone know how to fix this?
Thanks!
Would be nice to provide a spec file so people can build RPMS right-away.
Whatever the license is (PHP or BSD), please add a LICENSE file which is mandatory, per license term, for redistribution.
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
This extension is link against libsmbclient which is GPLv3, and whi is incompatible with this the BSD License
https://www.gnu.org/licenses/license-list.en.html#PHP-3.01
I think a License change is needed, else we'll have to remove this extension from Linux distribution
See: https://bugzilla.redhat.com/show_bug.cgi?id=1809406
Is it possible to get the file owner - either as a SID or string.
If so, how ?
If not, is this something that can be added ?
If I do var_dump(fileowner('smb://fileserver/share/file1.txt'));
then I just get "int(0)" as output - presume that is to tell me that "root" user owns the file, but this is not correct... I need the Windows/AD user...
Thanks in advance !
I've been having an issue with some of the files on a smb dfsr share. Can't quite narrow it down but it doesn't seem to be a permission issue, I can access the file fine in windows
I used the Dump a file to standard output to test this:
[Fri Apr 05 08:25:24.096494 2019] [core:notice] [pid 28400] AH00051: child pid 28976 exit signal Segmentation fault (11), possible coredump in /etc/apache2
I don't really know how to get more info on why it's happening.
Thanks
php-smbclient:
Installed: 0.8.0rc1-2build1rc1-2build1
Candidate: 0.8.0
Version table:
*** 0.8.0rc1-2build1 500rc1-2 500
500 http://au.archive.ubuntu.com/ubuntu xenial-updates/universe amd64 Packages
100 /var/lib/dpkg/status
0.8.0
500 http://au.archive.ubuntu.com/ubuntu xenial/universe amd64 Packages
It would be fantastic if one could initialize the state using "smbclient_state_init" then continue to use the stream wrapper, so that regular file management functions can be used, while authenticated, but not including the username and password in the used paths/URLs.
Would be nice if we had a spec file so people can build RPMS right-away.
Hi! Does anybody know how to install this plugin on a windows system?
Thank you very much!
Regards,
Martin
For discussion:
Extension name is libsmbclient, but libsmbclient.so is not a good name, and create confusion with the library.
Even "autotool" don't like it.
$ touch libsmbclient.c
$ make
*** Warning: Linking the shared library libsmbclient.la against the loadable module
*** libsmbclient.so is not portable!
*** Warning: Linking the shared library libsmbclient.la against the loadable module
*** libsmbclient.so is not portable!
libtool: link: rm -fr .libs/libsmbclient.la .libs/libsmbclient.lai .libs/libsmbclient.so
libtool: link: cc -shared -fPIC -DPIC .libs/libsmbclient.o .libs/smb_streams.o -Wl,-rpath -Wl,/work/GIT/libsmbclient-php/.libs -Wl,-rpath -Wl,/work/GIT/libsmbclient-php/modules /work/GIT/libsmbclient-php/.libs/libsmbclient.so -O2 -m64 -mtune=generic -Wl,-z -Wl,relro -Wl,-soname -Wl,libsmbclient.so -o .libs/libsmbclient.so
cc: error: /work/GIT/libsmbclient-php/.libs/libsmbclient.so: No such file or directory
Makefile:188: recipe for target 'libsmbclient.la' failed
make: *** [libsmbclient.la] Error 1
Ok, this can be workaround (make clean && make, and auto-provides filtering for downstream packaging)
Possible names:
Hello,
I still have the issue that debian wants to install php 7.2 dependencies - but I am on php 7.3
php7.2-cli php7.2-common php7.2-json php7.2-opcache php7.2-phpdbg php7.2-readline
but debian only provides your 0.9.0.3 version
https://packages.debian.org/de/source/sid/php-smbclient
any suggestion?
thank you very much for your support!
The smbclient notify
command allows clients to get notified whenever a file or folder is changed on the server.
From what I can tell this functionality is exposed as smbc_setFunctionNotify
in libsmbclient in newer versions of smbclient
Current when trying to do:
make DESTDIR=/home/pmjdebruijn/test install
The process fails trying install to my rootfs, where the it has no permissions as non-root.
Would it be possible to honour DESTDIR as this is beneficial to unpriviledged package builds.
After obtaining a valid Kerberos ticket with PECL krb5, a call to smbclient_stat('smb://host/share/')
returns error code 13 for access.
Using the same ticket cache file on command line, access to the network share works:
KRB5CCNAME=/tmp/(...)/krb5cc smbclient -k //host/share/
OS=[Windows Server 2008 R2 Standard 7601 Service Pack 1] Server=[Windows Server 2008 R2 Standard 6.1]
smb: \> ls
. D 0 Sun Oct 23 16:32:19 2016
.. D 0 Sun Oct 23 16:32:19 2016
(...)
-> I can browse the share; the kerberos cache file is the same one created using PECL krb5 1.1.1, so the bug is not necessarily in this library!
After downgrading PECL krb5 to 1.1.0, libsmbclient-php has access to the share.
I do not know if the bug is in the KRB5 library or in libsmbclient-php
Hi,
How can i download a file? I am able to list the contents of a folder etc. but just want to download a simple file.
i can't manage to do this with smbclient_open or read..
Am i missing something?
Thanks!
Hi,
The old (pre 3.x) version of PHP License this source code is using, is not really usable for anything else than PHP itself. Basically this license talks only about PHP, the PHP Group, and includes Zend Engine, so its not applicable to anything else.
It would be nice to change the license to something like LGPL or BSD that would properly achieve the freeness of the code as you see fit.
What about having this extension in PECL repository to get more visibility ?
I am compiling on FreeBSD 10.2-RELEASE. I've installed the samba-libsmbclient port, (which is based on samba 3.6, but whatever).
I am running:
./configure --prefix=/usr/local --with-libdir=/usr/local/lib
or
./configure --prefix=/usr/local
In both cases, configure dies with this error:
configure:4427: cc -o conftest -g -O2 -lsmbclient conftest.c -lsmbclient >&5 /usr/bin/ld: cannot find -lsmbclient
I set the environment variable LDFLAGS=-L/usr/local/lib
and then I see
configure:6283: cc -o conftest -g -O2 -L/usr/local/lib conftest.c conftstm.o >&5
and configure works correctly. Seems like the configure script isn't really processing many of the args it says it does.
Is there an ETA for a new stable release, or if not what are the blockers?
I'm asking as Remis fixes make the extension for my usable performance-wise.
Ralf
Hello,
I'm trying to copy files from a SMB share to a Linux host.
It is working so far verry good.
Code:
# Open file on server
$file = smbclient_open($state, 'smb://'.$remotePath."/".$smb[$i+2], 'r');
while (true) {
$data = smbclient_read($state, $file, 100000);
if ($data === false || strlen($data) === 0) {
break;
}
#write content to local file
file_put_contents($folder.$vendor."/".$invoicenrpath."/".$smb[$i+2], $data);
}
My problem is when the file is big ( I think more than the 100000 bytes) the file is not fully streamed to the local file.
is there an other way to copy a file from SMB share to local linux host?
Best regards
Tobias
Can't see what I'm doing wrong. Tried to follow the advice given in #36 but to no avail.
cc ${wl}-flat_namespace ${wl}-undefined ${wl}suppress -o .libs/smbclient.so -bundle .libs/smbclient.o .libs/smb_streams.o -L/usr/local/Cellar/samba/3.6.25//lib -lsmbclient -Wl,-rpath -Wl,/usr/local/Cellar/samba/3.6.25//lib duplicate symbol _php_stream_smb_wrapper in: .libs/smbclient.o .libs/smb_streams.o ld: 1 duplicate symbol for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation) make: *** [smbclient.la] Error 1
I've tried 0.8 and 0.9, same issue. Any ideas? Thanks!
When trying to install i got:
configure: error: Could not find libsmbclient.h
some day's earlier, it worked fine, something changed?
wanted to reinstall because php had trouble loding it:
PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib/php5/20131226/smbclient.so' - /usr/lib/php5/20131226/smbclient.so: undefined symbol: zend_list_close in Unknown on line 0
it seems the libsmbclient-php is dependend on php7 stuff
i found a debian package: https://packages.debian.org/stretch/php-smbclient
but it only installs it in the php7 folders
when i copy it to the php5 folders it won't load it.
how can i get php5 to also load the version 7 externtions?
We have one Ubuntu Server 16.04 with php 7.3, smbclient 4.3.11 and php-smbclient 1.0.0 and an other server with Ubuntu Server 18.04 with php 7.4., smbclient v4.10.15 and php-smbclient v1.0.0.
There is also an debian 10.3 with Samba 4.9.5, php-smbclient 0.9.0 where the mode returns 0x10.
On the 16.04 system smbclient_getxattr returns for a directory the mode 0x10 on the 18.04 system it returns for a directory the mode 0x41ed.
The mode is read with this code:
smbclient_getxattr($state, $uri, 'system.dos_attr.*');
My code to read the mode is:
<?php
$workgroup ='your workgroup or domain';
$user ='your user';
$pwd = 'your secret password';
$uri = 'smb://your.server.local/share';
// Create new state:
$state = smbclient_state_new();
// Initialize the state with workgroup, username and password:
smbclient_state_init($state, $workgroup, $user, $pwd);
$attr = @smbclient_getxattr($state, $uri, 'system.dos_attr.*');
var_dump($attr);
I don't understand where the 0x41ed comes from.
I've also checked your source and the source from samba but didn't find anything.
I think this problem is related to an smb configuration, but don't know which it can be?
Maybe you can point me to the right direction or solve my problem?
Found this while writing testcases. This innocent-looking script will generate a 4.1GB sparse file on my machine:
<?php
// Open a file, write something:
$state = smbclient_state_new();
smbclient_state_init($state, null, 'testuser', 'password');
$file = smbclient_creat($state, 'smb://localhost/testshare/lseektest.txt');
smbclient_write($state, $file, 'abcdefgh');
// Seek 3 characters onwards:
smbclient_lseek($state, $file, 3, SEEK_CUR);
// Write some more, close the file:
smbclient_write($state, $file, 'foo', 3);
smbclient_close($state, $file);
smbclient_state_free($state);
Expected outcome: a file of 14 bytes in size: the characters 'abcdefgh', three zero bytes, and 'foo'.
I tried unsuccessfully to reproduce this behaviour with an equivalent c program, which leads me to conclude that this is a bug in libsmbclient-php somewhere.
#include <string.h>
#include <libsmbclient.h>
static void
smbclient_auth_func (SMBCCTX *ctx, const char *server, const char *share, char *wrkg, int wrkglen, char *user, int userlen, char *pass, int passlen)
{
strcpy(wrkg, "");
strcpy(user, "testuser");
strcpy(pass, "password");
}
int main ()
{
char *uri = "smb://localhost/testshare/lseektest.txt";
SMBCCTX *ctx = smbc_new_context();
smbc_setFunctionAuthDataWithContext(ctx, smbclient_auth_func);
smbc_init_context(ctx);
SMBCFILE *file = smbc_getFunctionCreat(ctx)(ctx, uri, 0666);
smbc_getFunctionWrite(ctx)(ctx, file, "abcdefgh", 8);
smbc_getFunctionLseek(ctx)(ctx, file, 3, SEEK_CUR);
smbc_getFunctionWrite(ctx)(ctx, file, "foo", 3);
smbc_getFunctionClose(ctx)(ctx, file);
smbc_free_context(ctx, 1);
}
Makefile:
test: test.c
$(CC) -lsmbclient -I/usr/include/samba-4.0 -o $@ $^
The c program outputs a file 11 bytes in size, containing the string 'abcdefghfoo'. Better, but also not what I expected.
More weirdness: in the PHP version, the lseek call returns '3'. In the c version, the lseek call returns '8'. Neither is correct from the documentation's point of view, since the return value should be the current absolute offset into the file (that is, '11').
Just read libsmbclient.h
and found that libsmbclient expects all URI's to be urlencoded. This means for instance that reading or writing a file called ex%2Fample.txt
(a strange but valid filename) will not work as expected, since the library decodes the %2F
to a slash.
This is unexpected behaviour. Especially since smbclient_readdir
does not return urlencoded names "for backwards compatibility". I think we can handle this in two ways:
smbc_urlencode
library function, so that the end user does not notice anything.Because the second option breaks backwards compatibility, I propose to leave the current behaviour at least in the 0.5 branch, and improve the documentation to make the issue clear.
Hello,
I recently installed ownCloud 9.1.1 on a 14.04.5 installation. I followed the libsmbclient-php instructions here: https://github.com/eduardok/libsmbclient-php/ to get SMB shares to work. I also had to install libsmbclient-dev to get past a missing file error. As it stands, I have the following issues...
The instructions didn't cite which php.ini to add extension="smbclient.so", so I assumed /etc/php5/cli/php.ini was the correct one. Is this correct? I have the 5 different ones: /etc/php5/apache2/php.ini, /etc/php5/cli/php.ini, /usr/share/php5/php.ini-dev, /usr/share/php5/php.ini-production and /usr/share/php5/php.ini-production.cli
After adding extension="smbclient.so" to /etc/php5/cli/php.ini, I get the following PHP error: PHP Startup: Unable to load dynamic library '/usr/lib/php5/20121212/smbclient.so' - /usr/lib/php5/20121212/smbclient.so: cannot open shared object file: No such file or directory in Unknown on line 0.
An obvious side effect of the above two issues is that I cannot access SMB shares via ownCloud. I get the following error when trying to access any shares via the web: "Storage not available" and the folder is empty.
Thoughts? Thanks all.
Hi have downloaded your 0.7 and 0.8 version and I'm unable to install it.
After ./configure i have error:
Server-1:smbclient-0.8.0RC1 psadmin$ ./configure --enable-shared
checking for grep that handles long lines and -e... /usr/bin/grep
checking for egrep... /usr/bin/grep -E
checking for a sed that does not truncate output... /usr/bin/sed
checking for cc... cc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables...
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether cc accepts -g... yes
checking for cc option to accept ISO C89... none needed
checking how to run the C preprocessor... cc -E
checking for icc... no
checking for suncc... no
checking whether cc understands -c and -o together... yes
checking for system library directory... lib
checking if compiler supports -R... no
checking if compiler supports -Wl,-rpath,... yes
checking build system type... x86_64-apple-darwin15.2.0
checking host system type... x86_64-apple-darwin15.2.0
checking target system type... x86_64-apple-darwin15.2.0
checking for PHP prefix... /usr/local/Cellar/php55/5.5.31
checking for PHP includes... -I/usr/local/Cellar/php55/5.5.31/include/php -I/usr/local/Cellar/php55/5.5.31/include/php/main -I/usr/local/Cellar/php55/5.5.31/include/php/TSRM -I/usr/local/Cellar/php55/5.5.31/include/php/Zend -I/usr/local/Cellar/php55/5.5.31/include/php/ext -I/usr/local/Cellar/php55/5.5.31/include/php/ext/date/lib
checking for PHP extension directory... /usr/local/Cellar/php55/5.5.31/lib/php/extensions/no-debug-non-zts-20121212
checking for PHP installed headers prefix... /usr/local/Cellar/php55/5.5.31/include/php
checking if debug is enabled... no
checking if zts is enabled... no
checking for re2c... no
configure: WARNING: You will need re2c 0.13.4 or later if you want to regenerate PHP parsers.
checking for gawk... no
checking for nawk... no
checking for awk... awk
checking if awk is broken... no
checking whether to enable smbclient support... yes, shared
checking for libsmbclient support... yes, shared
checking for libsmbclient.h in default paths... not found
configure: error: Could not find libsmbclient.h
Please can you help me?
The function definition defines only 2 parameters (state and file) while the implementation (and documentation) use 3 parameters (state, file and count)
I'm not sure if this has any behavioral effects but it causes reflection to report an invalid number of parameters which in turns trips static code analysers
Currently the description of smbclient_chmod
states
According to the libsmbclient header file, this function is not implemented. However, the Samba sources do seem to implement it
However, samba only seems to partly implement chmod, according to my own research libsmbclient/smbd seems to ignore the group and other bits and always set those to read only, meaning that it's impossible to set the hidden or system bits (i.e. chmod 0677 and chmod 0644 result in the same behaviour).
Note that is also doesn't seem possible to set those bits using setmode test.txt +h
with smbclient
Additionally, when setting the file mode directly on the file system, (lib)smbclient does read those bits correctly from the unix file permissions
I'd been working on context support but noticed that it's been added anyway which is great. However freeing the context seems to occasionally cause a segfault the next time that smbclient_opendir is called.
Example script:-
$state = smbclient_state_new();
smbclient_state_init($state, 'WORKGROUP', 'username', 'password');
$dir = smbclient_opendir($state, $url);
smbclient_closedir($state, $dir);
smbclient_state_free($state);
The first three or four requests are fine, after that it begins seemingly randomly segfaulting. Removing any mention of smbc_free_context from libsmbclient.c prevents the issue from happening but obviously isn't ideal because connections are then left open.
I'm testing this with PHP 5.5 on Apache Prefork.
Let me know if you need any more information.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.